' CallOllama_Dialog.bas
#PBFORMS CREATED V2.01
'------------------------------------------------------------------------------
' The first line in this file is a PB/Forms metastatement.
' It should ALWAYS be the first line of the file. Other
' PB/Forms metastatements are placed at the beginning and
' end of "Named Blocks" of code that should be edited
' with PBForms only. Do not manually edit or delete these
' metastatements or PB/Forms will not be able to reread
' the file correctly.  See the PB/Forms documentation for
' more information.
' Named blocks begin like this:    #PBFORMS BEGIN ...
' Named blocks end like this:      #PBFORMS END ...
' Other PB/Forms metastatements such as:
'     #PBFORMS DECLARATIONS
' are used by PB/Forms to insert additional code.
' Feel free to make changes anywhere else in the file.
'------------------------------------------------------------------------------

#COMPILE EXE
#DIM ALL

'------------------------------------------------------------------------------
'   ** Includes **
'------------------------------------------------------------------------------
#PBFORMS BEGIN INCLUDES
#RESOURCE "CallOllama_Dialog.pbr"
%USEMACROS = 1
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "COMMCTRL.INC"
#INCLUDE ONCE "PBForms.INC"
#PBFORMS END INCLUDES
'------------------------------------------------------------------------------
#INCLUDE "PB_Windows_Controls.inc"
#INCLUDE "PB_HTML.inc"
#INCLUDE "PB_FileHandlingRoutines.inc"
'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
#PBFORMS BEGIN CONSTANTS
%IDD_dlgOllama           =  101
%IDC_STATUSBAR1          = 1001
%IDC_lblSelectModel      = 1003
%IDC_lblEnterPrompt      = 1004
%IDC_txtEnterPrompt      = 1005
%IDC_cboSelectModel      = 1002
%IDC_btnRUNQUERY         = 1006
%IDC_lblInputFile        = 1007
%IDC_txtInputFile        = 1008
%IDC_lblOutput           = 1009
%IDC_chkInputFile        = 1010
%IDC_lblHTMLformatOutput = 1011
%IDC_chkHTMLformatOutput = 1012
%IDC_imgBrowse           = 1013
%IDC_lblCheckingServer   = 1014
%IDC_lblStatus           = 1015
#PBFORMS END CONSTANTS
'------------------------------------------------------------------------------
%ID_OCX = 2000
%Progress_Completed = 2001
%ID_TIMER1          = 2002    ' timer for startup
'------------------------------------------------------------------------------
'   ** Declarations **
'------------------------------------------------------------------------------
' create a UDT for Ollama data
TYPE udtOllamaData
  lngHTMLformat AS LONG
  hDlg          AS LONG
  strInputFile  AS STRING * 500
  strOutputFile AS STRING * 500
  strModel      AS STRING * 100
  strPrompt     AS STRING * 500
END TYPE
'
GLOBAL g_uOllamaData AS udtOllamaData
GLOBAL g_idThread AS LONG    ' thread handle
'
#PBFORMS DECLARATIONS
'------------------------------------------------------------------------------
#RESOURCE ICON, imgApp,"AI_Client.ico"
#RESOURCE ICON, imgBrowse,"load.ico"
'------------------------------------------------------------------------------
'   ** Main Application Entry Point **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
  LOCAL lngResult AS LONG
  PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR _
    %ICC_INTERNET_CLASSES)
  lngResult = ShowdlgStartup(%HWND_DESKTOP)
  '
  IF lngResult = %IDOK THEN
    ShowdlgOllama %HWND_DESKTOP
  ELSE
  ' Ollama server not started
    MSGBOX "Ollama Server not running", %MB_ICONERROR, _
           "Ollama Server error"
    '
  END IF
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ShowdlgOllamaProc()
  LOCAL lngResult AS LONG  ' result of check box check
  '
  LOCAL strPrompt AS STRING      ' prompt to be used
  LOCAL strInputFile AS STRING   ' path and name of input file
  LOCAL strOutputFile AS STRING  ' path and name of output file
  LOCAL strModel AS STRING       ' name of model to be used
  LOCAL lngHTMLformat AS LONG    ' 1/0 for state of HTML format checkbox
  '
  LOCAL lngStatus AS LONG            ' status returned
  LOCAL lngFlags AS LONG             ' flags for file browsing
  LOCAL strFilter AS STRING          ' filter template for file
  LOCAL strFile AS STRING            ' selected file
  '
  SELECT CASE AS LONG CB.MSG
    CASE %WM_INITDIALOG
    ' Initialization handler
      ' populate and preselect the model
      DIM a_strModels(1 TO 2) AS STRING
      ARRAY ASSIGN a_strModels() = "gpt-oss:20b","gpt-oss:120b"
      funPopulateCombo(CB.HNDL, _
                       %IDC_cboSelectModel, _
                       a_strModels(), _
                       a_strModels(2))
                       '
      ' preselect the html output format
      CONTROL SET CHECK CB.HNDL,%IDC_chkHTMLformatOutput,1
      '
      ' hide the input box
      PREFIX "CONTROL HIDE CB.HNDL,"
        %IDC_txtInputFile
        %IDC_imgBrowse
      END PREFIX
      '
      LOCAL XStart,Ystart,lngHeight,lngWidth AS LONG
      '
      XStart    = 30
      Ystart    = 185
      lngHeight = 210
      lngWidth  = 635
      ' prep for html control
      mPrepHTML(CB.HNDL,XStart,Ystart,lngHeight,lngWidth)
      '
      LOCAL strURL AS STRING
      strURL = "file://" & EXE.PATH$ & "BlankOutput.html"
      ' Populate the selected html control
      ' with the content of the URL
      funPopulateHTML(CB.HNDL, _
                      strURL, _
                      %ID_OCX)
      '
    CASE %WM_NCACTIVATE
      STATIC hWndSaveFocus AS DWORD
      IF ISFALSE CB.WPARAM THEN
        ' Save control focus
        hWndSaveFocus = GetFocus()
      ELSEIF hWndSaveFocus THEN
        ' Restore control focus
        SetFocus(hWndSaveFocus)
        hWndSaveFocus = 0
      END IF
      '
    CASE %Progress_Completed
    ' thread has completed
      THREAD CLOSE g_idThread TO lngStatus
      '
      ' now populate the OCX html control
      strOutputFile = EXE.PATH$ & "OutputFile.html"
      IF ISTRUE ISFILE(strOutputFile) THEN
      ' output file exists
        strURL = "file://" & strOutputFile
      ELSE
        strURL = "file://" & EXE.PATH$ & "NoFile.html"
      END IF
      '
      funPopulateHTML(CB.HNDL, _
                      strURL, _
                      %ID_OCX)
      '
      CONTROL SET TEXT CB.HNDL, %IDC_STATUSBAR1,"Processing Completed
      ' re-enable the button
      CONTROL ENABLE CB.HNDL,%IDC_btnRUNQUERY
      '
    CASE %WM_COMMAND
      ' Process control notifications
      SELECT CASE AS LONG CB.CTL
       ' /* Inserted by PB/Forms 09-25-2025 11:00:03
         CASE %IDC_imgBrowse
          IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
          ' browse for a txt file
            lngFlags = %OFN_FILEMUSTEXIST OR _
                       %OFN_PATHMUSTEXIST
                       '
            strFilter = CHR$("Text", 0, "*.TXT", 0)
            DISPLAY OPENFILE CB.HNDL,,,"Select a Text file for input", _
                             EXE.PATH$,strFilter,"",".txt",lngFlags TO strFile
                             '
            IF strFile <> "" THEN
            ' set file selected
              CONTROL SET TEXT CB.HNDL,%IDC_txtInputFile, strFile
            END IF
            '
          END IF
          '
        ' /* Inserted by PB/Forms 09-15-2025 15:15:27
        CASE %IDC_chkInputFile
        ' ticked or unticked
          IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
            CONTROL GET CHECK CB.HNDL, CB.CTL TO lngResult
            IF lngResult = 0 THEN
            ' box has been unchecked
              PREFIX "CONTROL HIDE CB.HNDL,"
                %IDC_txtInputFile
                %IDC_imgBrowse
              END PREFIX
              '
            ELSE
            ' box has been checked
              PREFIX "CONTROL NORMALIZE CB.HNDL,"
                %IDC_txtInputFile
                %IDC_imgBrowse
              END PREFIX
              '
              CONTROL SET TEXT CB.HNDL,%IDC_txtInputFile, EXE.PATH$
            END IF
          END IF
          '
        CASE %IDC_STATUSBAR1

        CASE %IDC_cboSelectModel

        CASE %IDC_txtEnterPrompt

        CASE %IDC_btnRUNQUERY
          IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
            ' disable the button
            CONTROL DISABLE CB.HNDL,CB.CTL
            '
             ' now overwrite the OCX html control
            strURL = "file://" & EXE.PATH$ & "BlankOutput.html"
            funPopulateHTML(CB.HNDL, _
                            strURL, _
                            %ID_OCX)
                            '
            ' pick up the inputs
            CONTROL GET CHECK CB.HNDL,%IDC_chkHTMLformatOutput _
                              TO lngHTMLformat
            CONTROL GET TEXT CB.HNDL,%IDC_cboSelectModel _
                              TO strModel
            '
            ' is there an input file?
            CONTROL GET CHECK CB.HNDL, %IDC_chkInputFile _
                              TO lngResult
            IF lngResult = 0 THEN
              strInputFile = ""
            ELSE
              CONTROL GET TEXT CB.HNDL,%IDC_txtInputFile _
                               TO strInputFile
            END IF
            '
            CONTROL GET TEXT CB.HNDL,%IDC_txtEnterPrompt TO strPrompt
            REPLACE $CRLF WITH " " IN strPrompt
            strPrompt = TRIM$(strPrompt)
            '
            strOutputFile = EXE.PATH$ & "OutputFile.html"
            '
            CONTROL SET TEXT CB.HNDL, %IDC_STATUSBAR1,"Processing..."
            '
            PREFIX "g_uOllamaData."
              strInputFile  = strInputFile
              strPrompt     = strPrompt
              strOutputFile = strOutputFile
              strModel      = strModel
              lngHTMLformat = lngHTMLformat
              hDlg          = CB.HNDL
            END PREFIX
            '
            THREAD CREATE funTHCallOllama(lngStatus) TO g_idThread
            ' thread will post a custom message when completed
          END IF

        CASE %IDC_txtInputFile

      END SELECT
  END SELECT
  '
END FUNCTION
'------------------------------------------------------------------------------
FUNCTION funCallOllama_withInput(strInputFile AS STRING, _
                                 strPrompt AS STRING, _
                                 strOutputFile AS STRING, _
                                 strModel AS STRING) AS LONG
' call Ollama on the command line an give it an input
  LOCAL strCMD AS STRING         ' holds command line string
  LOCAL strOllamaBatch AS STRING ' batch file to run
  LOCAL strInputString AS STRING ' used to hold optional
                                 ' input file name
  '
  IF TRIM$(strInputFile) = "" THEN
  ' no input file?
    strInputString = ""
  ELSE
  ' populate the Input file section of strCMD
    strInputString =  " < " & $DQ & strInputFile & $DQ
  END IF
  '
  strOllamaBatch = EXE.PATH$ & "Ollama_Batch.bat
  '
  strCMD = "ollama run " & strModel & " " & _
           $DQ & strPrompt & $DQ & _
           strInputString & _
           " >>" & $DQ & strOutputFile & $DQ
           '
  TRY
    KILL strOllamaBatch
  CATCH
  FINALLY
  END TRY
  '
  TRY
    KILL strOutputFile
  CATCH
  FINALLY
  END TRY
  '
  funAppendToFile(strOllamaBatch,strCMD)
  funExecCmd(strOllamaBatch & "")
  '
  FUNCTION = %TRUE
  '
END FUNCTION
'
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowdlgOllama(BYVAL hParent AS DWORD) AS LONG
  LOCAL lRslt AS LONG

#PBFORMS BEGIN DIALOG %IDD_dlgOllama->->
  LOCAL hDlg   AS DWORD
  LOCAL hFont1 AS DWORD

  DIALOG NEW hParent, "Query using Ollama", 324, 189, 693, 447, %WS_POPUP OR _
    %WS_BORDER OR %WS_DLGFRAME OR %WS_THICKFRAME OR %WS_CAPTION OR _
    %WS_SYSMENU OR %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_CLIPSIBLINGS OR _
    %WS_VISIBLE OR %DS_MODALFRAME OR %DS_CENTER OR %DS_3DLOOK OR _
    %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR _
    %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
  CONTROL ADD STATUSBAR, hDlg, %IDC_STATUSBAR1, "Ready", 0, 0, 0, 0
  CONTROL ADD COMBOBOX,  hDlg, %IDC_cboSelectModel, , 25, 120, 125, 40, _
    %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %CBS_DROPDOWNLIST OR _
    %CBS_SORT, %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
  CONTROL ADD LABEL,     hDlg, %IDC_lblSelectModel, "Select Model", 25, 110, _
    100, 10
  CONTROL SET COLOR      hDlg, %IDC_lblSelectModel, %BLUE, -1
  CONTROL ADD LABEL,     hDlg, %IDC_lblEnterPrompt, "Enter Prompt", 25, 20, _
    100, 10
  CONTROL SET COLOR      hDlg, %IDC_lblEnterPrompt, %BLUE, -1
  CONTROL ADD TEXTBOX,   hDlg, %IDC_txtEnterPrompt, "", 25, 30, 635, 65, _
    %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %ES_LEFT OR %ES_MULTILINE OR _
    %ES_AUTOHSCROLL OR %ES_WANTRETURN, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR _
    %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
  CONTROL ADD BUTTON,    hDlg, %IDC_btnRUNQUERY, "Run Query", 580, 400, 75, _
    25
  CONTROL ADD LABEL,     hDlg, %IDC_lblInputFile, "Input File?", 210, 110, _
    50, 10
  CONTROL SET COLOR      hDlg, %IDC_lblInputFile, %BLUE, -1
  CONTROL ADD TEXTBOX,   hDlg, %IDC_txtInputFile, "", 210, 120, 430, 15
  CONTROL ADD LABEL,     hDlg, %IDC_lblOutput, "Output", 30, 170, 100, 10
  CONTROL SET COLOR      hDlg, %IDC_lblOutput, %BLUE, -1
  CONTROL ADD CHECKBOX,  hDlg, %IDC_chkInputFile, "", 265, 110, 100, 10
  CONTROL ADD LABEL,     hDlg, %IDC_lblHTMLformatOutput, "HTML format " + _
    "output?", 210, 151, 70, 10
  CONTROL SET COLOR      hDlg, %IDC_lblHTMLformatOutput, %BLUE, -1
  CONTROL ADD CHECKBOX,  hDlg, %IDC_chkHTMLformatOutput, "", 285, 151, 100, _
    10

  FONT NEW "MS Sans Serif", 14, 0, %ANSI_CHARSET TO hFont1

  CONTROL SET FONT hDlg, %IDC_txtEnterPrompt, hFont1
#PBFORMS END DIALOG
  DIALOG SET ICON hDlg,"imgApp"
  ' add the image to the button
  CONTROL SET IMGBUTTON hDlg, %IDC_imgBrowse, "imgBrowse"
  '
  DIALOG SHOW MODAL hDlg, CALL ShowdlgOllamaProc TO lRslt

#PBFORMS BEGIN CLEANUP %IDD_dlgOllama
  FONT END hFont1
#PBFORMS END CLEANUP

  FUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------
'
FUNCTION funExecCmd(cmdLine1 AS ASCIIZ, OPTIONAL BYVAL lngConsole AS LONG) AS LONG
  DIM rcProcess AS Process_Information
  DIM rcStart AS startupInfo
  DIM Retc AS LONG
  '
  DIM lngWindow AS LONG
  '
  IF lngConsole = 0 OR lngConsole = %CREATE_NO_WINDOW THEN
    lngWindow = %CREATE_NO_WINDOW
  ELSE
    lngWindow = %CREATE_NEW_CONSOLE
  END IF
  '
  rcStart.cb = LEN(rcStart)
  '
  RetC = CreateProcess(BYVAL %NULL, CmdLine1, BYVAL %NULL, BYVAL %NULL, 1&, lngWindow OR _
                       %NORMAL_PRIORITY_CLASS, _
                       BYVAL %NULL, BYVAL %NULL, rcStart, rcProcess)
  RetC = %WAIT_TIMEOUT
  DO WHILE RetC = %WAIT_TIMEOUT
    RetC = WaitForSingleObject(rcProcess.hProcess,-1)
    SLEEP 50
  LOOP
  CALL GetExitCodeProcess(rcProcess.hProcess, RetC)
  CALL CloseHandle(rcProcess.hThread)
  CALL CloseHandle(rcProcess.hProcess)
  '
END FUNCTION
'
THREAD FUNCTION funTHCallOllama(BYVAL lngStatus AS LONG) AS LONG
' call Ollama for response
  ' call Ollama on the command line an give it an input
  LOCAL strCMD AS STRING          ' holds command line string
  LOCAL strOllamaBatch AS STRING  ' batch file to run
  LOCAL strInputString AS STRING  ' used to hold optional
                                  ' input file name
  LOCAL strPrompt AS STRING       ' prompt to be used
  '
  IF TRIM$(g_uOllamaData.strInputFile) = "" THEN
  ' no input file?
    strInputString = ""
  ELSE
  ' populate the Input file section of strCMD
    strInputString =  " < " & $DQ & TRIM$(g_uOllamaData.strInputFile) & $DQ
  END IF
  '
  strPrompt = TRIM$(g_uOllamaData.strPrompt)
  '
  IF g_uOllamaData.lngHTMLformat = 1 THEN
  ' force html format
    strPrompt = strPrompt & " .Provide output in HTML format"
  '
  END IF
  '
  strOllamaBatch = EXE.PATH$ & "Ollama_Batch.bat
  '
  strCMD = "ollama run " & TRIM$(g_uOllamaData.strModel) & " " & _
           $DQ & strPrompt & $DQ & _
           strInputString & _
           " >>" & $DQ & TRIM$(g_uOllamaData.strOutputFile) & $DQ
           '
  ' wipe any existing batch file
  mWipe_A_File(strOllamaBatch)
  '
  ' wipe any existing output file
  mWipe_A_File(TRIM$(g_uOllamaData.strOutputFile))
  '
  ' save the batch file
  funAppendToFile(strOllamaBatch,strCMD)
  '
  ' execute the batch file and wait till completed
  funExecCmd(strOllamaBatch & "")
  '
  FUNCTION = %TRUE
  '
  ' post completed message to dialog
  DIALOG POST g_uOllamaData.hDlg, %Progress_Completed,0,0
  '
END FUNCTION
'
FUNCTION ShowdlgStartup(BYVAL hParent AS DWORD) AS LONG
  LOCAL lRslt  AS LONG

#PBFORMS BEGIN DIALOG %IDD_dlgStartup->->
  LOCAL hDlg   AS DWORD
  LOCAL hFont1 AS DWORD

  DIALOG NEW hParent, "Checking Ollama Server", 549, 273, 262, 121, %WS_POPUP _
    OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _
    %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_CENTER OR _
    %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR _
    %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
  CONTROL ADD LABEL, hDlg, %IDC_lblCheckingServer, "Please Wait.. Checking " + _
    "Server", 25, 10, 210, 30
  CONTROL SET COLOR  hDlg, %IDC_lblCheckingServer, %BLUE, -1
  CONTROL ADD LABEL, hDlg, %IDC_lblStatus, "Waiting....", 25, 45, 210, 45

  FONT NEW "MS Sans Serif", 14, 0, %ANSI_CHARSET TO hFont1

  CONTROL SET FONT hDlg, %IDC_lblCheckingServer, hFont1
  CONTROL SET FONT hDlg, %IDC_lblStatus, hFont1
#PBFORMS END DIALOG

  DIALOG SHOW MODAL hDlg, CALL ShowdlgStartupProc TO lRslt

#PBFORMS BEGIN CLEANUP %IDD_dlgStartup
  FONT END hFont1
#PBFORMS END CLEANUP

  FUNCTION = lRslt
END FUNCTION
'
CALLBACK FUNCTION ShowdlgStartupProc()
  '
  SELECT CASE AS LONG CB.MSG
    CASE %WM_INITDIALOG
    ' Initialization handler
       SetTimer(CB.HNDL, %ID_TIMER1, _
               1000, BYVAL %NULL)
               '
    CASE %WM_NCACTIVATE
      STATIC hWndSaveFocus AS DWORD
      IF ISFALSE CB.WPARAM THEN
        ' Save control focus
        hWndSaveFocus = GetFocus()
      ELSEIF hWndSaveFocus THEN
        ' Restore control focus
        SetFocus(hWndSaveFocus)
        hWndSaveFocus = 0
      END IF
      '
    CASE %WM_TIMER
      SELECT CASE CB.WPARAM
        CASE %ID_TIMER1
        ' timer triggered
          KillTimer(CB.HNDL, %ID_TIMER1)
          '
          IF ISTRUE funCheckOllamaServer(CB.HNDL) THEN
          ' Ollama server started
            DIALOG END CB.HNDL,%IDOK
          ELSE
          ' unable to start server
            DIALOG END CB.HNDL,%IDABORT
          END IF
        '
      END SELECT
      '
    CASE %WM_COMMAND
      ' Process control notifications
      SELECT CASE AS LONG CB.CTL

      END SELECT
  END SELECT
  '
END FUNCTION
'
FUNCTION funCheckOllamaServer(hDlg AS DWORD) AS LONG
' check the ollama server is up and running
  LOCAL strCMD AS STRING          ' command line string
  LOCAL strOllamaBatch AS STRING  ' path/name of batch file
  LOCAL strOutput AS STRING       ' output from the batch file
  '
  strCMD = "curl http://127.0.0.1:11434/api/version > " & _
            $DQ & EXE.PATH$ & "OllamaServer.txt" & $DQ
            '
  strOllamaBatch = EXE.PATH$ & "Ollama_Batch.bat"
  '
  ' wipe any existing batch file
  mWipe_a_file(strOllamaBatch)
  '
  ' wipe any existing output file
  mWipe_a_file(EXE.PATH$ & "OllamaServer.txt")
  '
  '
  ' save the batch file
  funAppendToFile(strOllamaBatch,strCMD)
  '
  ' execute the batch file and wait till completed
  funExecCmd(strOllamaBatch & "")
  '
  ' now look for version string?
  strOutput = funBinaryFileAsString(EXE.PATH$ & "OllamaServer.txt")
  IF INSTR(strOutput,"{""version"":") > 0 THEN
    FUNCTION = %TRUE
  ELSE
  ' server not started ?
    MSGBOX "The Ollama server is not running" & $CRLF & _
           "Please start the server",%MB_ICONERROR, _
           "Ollama server issue"
           '
    FUNCTION = %FALSE
  END IF
  '
END FUNCTION
'